/**
 * @FilePath     : /py-exportdll/wrapper.c
 * @Description  :  
 * @Author       : desyang
 * @Date         : 2025-07-19 16:51:11
 * @LastEditors  : desyang
 * @LastEditTime : 2025-07-19 23:43:09
**/
#define PY_SSIZE_T_CLEAN
#include <Python.h>

// 导入 mymodule 模块
// 定义一个静态的Python函数，用于调用py2dll.calc模块中的add函数
static PyObject* py_add(PyObject* self, PyObject* args) {
    // 导入py2dll.calc模块
    PyObject* module = PyImport_ImportModule("py2dll.calc");
    // 如果导入失败，设置错误信息并返回NULL
    if (!module) {
        PyErr_SetString(PyExc_RuntimeError, "Failed to import mymodule.calc");
        return NULL;
    }

    // 获取py2dll.calc模块中的add函数
    PyObject* func = PyObject_GetAttrString(module, "add");
    // 如果获取失败或者add函数不可调用，设置错误信息并返回NULL
    if (!func || !PyCallable_Check(func)) {
        PyErr_SetString(PyExc_RuntimeError, "Function 'add' not found");
        Py_XDECREF(module);
        return NULL;
    }

    // 调用add函数，并返回结果
    PyObject* result = PyObject_CallObject(func, args);
    // 释放module和func的引用计数
    Py_DECREF(module);
    Py_DECREF(func);
    // 返回结果
    return result;
}

static PyObject* py_greet(PyObject* self, PyObject* args) {
    // 导入py2dll.calc模块
    PyObject* module = PyImport_ImportModule("py2dll.utils");
    // 如果导入失败，设置错误信息并返回NULL
    if (!module) {
        PyErr_SetString(PyExc_RuntimeError, "Failed to import py2dll.utils");
        return NULL;
    }

    // 获取py2dll.calc模块中的add函数
    PyObject* func = PyObject_GetAttrString(module, "greet");
    // 如果获取失败或者add函数不可调用，设置错误信息并返回NULL
    if (!func || !PyCallable_Check(func)) {
        PyErr_SetString(PyExc_RuntimeError, "Function 'greet' not found");
        Py_XDECREF(module);
        return NULL;
    }

    // 调用add函数，并返回结果
    PyObject* result = PyObject_CallObject(func, args);
    // 释放module和func的引用计数
    Py_DECREF(module);
    Py_DECREF(func);
    // 返回结果
    return result;
}

static PyMethodDef WrapperMethods[] = {
    {"add", py_add, METH_VARARGS, "Call mymodule.calc.add"},
    {"greet", py_greet, METH_VARARGS, "Call py2dll.greet.greet"},
    {NULL, NULL, 0, NULL}
};

static struct PyModuleDef wrappermodule = {
    PyModuleDef_HEAD_INIT,
    .m_name = "wrapper",
    .m_doc = "Wrapper module for mymodule",
    .m_size = -1,
    .m_methods = WrapperMethods,
};

// 初始化模块
PyMODINIT_FUNC PyInit_wrapper(void) {
    // 创建模块
    return PyModule_Create(&wrappermodule);
}